#ifndef QUEUE_TEST_H_
#define QUEUE_TEST_H_

#include <Mutex.hh>
#include <BlockingQueue.hh>
#include "Test.hh"

//
/**
 * \file QueueTest.hh
 * \author  jsk <jsk.jinsubkim@gmail.com>
 * \version 1.0
 *
 * \class QueueTest QueueTest.hh
 *
 * 
 */
class QueueTest : public Test
{
public:
	/**
	 * \name testBasicCase
	 * 
	 * FIFO가 달성되는지 검증한다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf testBasicCase(BlockingQueue* Target);
	
	/**
	 * \name testMIMO
	 * 
	 * 여러 스레드가 입력하고, 동시에 여러 스레드가 출력 할때를 검증한다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf testMIMO(BlockingQueue* Target);
	virtual ResultOf testMIMO2(BlockingQueue* Target);
	
protected:
	/**
	 * \name enqueue
	 * 
	 * 큐에 입력을 한다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	static void* enqueue(void* Param);
	static void* enqueue2(void* Param);
	
	/**
	 * \name dequeue
	 * 
	 * 큐에서 출력을 받는다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	static void* dequeue(void* Param);
	static void* dequeue2(void* Param);
	
protected:
	/**
	 * ?
	 */
	static bool Exit;
	static Number Var;
	static Number Var2;
	
	/**
	 * Lock
	 */
	static Mutex EnqueueKey;
	static Mutex DequeueKey;
	
	static const Number LoopCount = 1000;
	static const Number LoopCount2 = 10;
};

#endif //QUEUE_TEST_H_